package com.phoenix.jsef.code.generator.configuration;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;

@Configuration
@ConditionalOnClass({ DruidDataSource.class })
@ConditionalOnProperty(name = {"spring.datasource.type"}, havingValue = "com.alibaba.druid.pool.DruidDataSource", matchIfMissing = true)
@EnableConfigurationProperties(DruidDataSourceProperties.class) // 注入Properties
public class DruidDataSourceConfig {
	
	@Bean(value="druidDataSource")
	public DruidDataSource dataSource(DataSourceProperties dataSourceProperties,
			DruidDataSourceProperties druidDataSourceProperties) {
		DruidDataSource druidDataSource = (DruidDataSource) dataSourceProperties.initializeDataSourceBuilder()
				.type(DruidDataSource.class).build();
		druidDataSource.configFromPropety(druidDataSourceProperties.toProperties());
		druidDataSource.setInitialSize(druidDataSourceProperties.getInitialSize());
		druidDataSource.setMinIdle(druidDataSourceProperties.getMinIdle());
		druidDataSource.setMaxActive(druidDataSourceProperties.getMaxActive());
		druidDataSource.setMaxWait(druidDataSourceProperties.getMaxWait());
		druidDataSource.setConnectProperties(druidDataSourceProperties.getConnectionProperties());

		return druidDataSource;
	}
	
	
	//启动应用就可以访问：http://127.0.0.1:8080/druid/index.html输入账号和密码：admin/123456 就可以访问了。
	@Bean
	public ServletRegistrationBean druidStatViewServlet() {
		//org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
		ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
		// 添加初始化参数：initParams
		// 白名单：
		servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
		// IP黑名单 (存在共同时，deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to
		// view this page.
		servletRegistrationBean.addInitParameter("deny", "192.168.1.73");
		// 登录查看信息的账号密码.
		servletRegistrationBean.addInitParameter("loginUsername", "admin");
		servletRegistrationBean.addInitParameter("loginPassword", "123456");
		// 是否能够重置数据.
		servletRegistrationBean.addInitParameter("resetEnable", "false");
		return servletRegistrationBean;
	}

	@Bean
	public FilterRegistrationBean druidWebStatFilter() {
		FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
		// 添加过滤规则.
		filterRegistrationBean.addUrlPatterns("/*");
		// 添加不需要忽略的格式信息.
		filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
		return filterRegistrationBean;
	}
}
